package com.mauriciobustamante.pds.biz;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

import org.orm.PersistentException;
import org.orm.PersistentTransaction;

import orm.DAOFactory;
import orm.Paciente;
import orm.Prestacion;
import orm.PrestacionPaciente;
import orm.dao.PacienteDAO;
import orm.dao.PrestacionDAO;
import orm.dao.PrestacionPacienteDAO;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

/**
 *  Clase que representa la capa de negocios del sistema. Maneja las consultas entre
 *  android y la capa de abstraccion manejada por hibernate
 */
public class Clinica {

	/**
	 * Instantiates a new clinica.
	 */
	public Clinica() {
		super();
	}
	
	// pacientes

	/**
	 * Devuelve paciente
	 *
	 * @param pacienteJSON json que representa el paciente. Debe llevar al menos el rut ej: {"rut":"algo"}
	 * @return the paciente
	 */
	public String getPaciente(String pacienteJSON) {
		JsonObject resultado = new JsonObject();
		if (pacienteJSON == null || pacienteJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject paciente = jsonParser.parse(pacienteJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		System.out.println(pacienteJSON);
		if (!paciente.has("rut")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta",  "Paciente no contiente el rut");
			return resultado.toString();
		}
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		try {
			Paciente pacienteORM = lDAOFactory.getPacienteDAO()
					.getPacienteByORMID(paciente.get("rut").getAsString());
			
			if(pacienteORM == null){
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta",  "Paciente no existe");
				return resultado.toString();
			}
			

			// se hace manual puesto que GSON se queja de relacion
			// circular
			JsonObject pacienteJSON1 = new JsonObject();
			pacienteJSON1.addProperty("direccion", pacienteORM.getDireccion());
			pacienteJSON1.addProperty("nombre", pacienteORM.getNombre());
			pacienteJSON1.addProperty("rut", pacienteORM.getRut());


			resultado.addProperty("resultado", 1);
			resultado.add("respuesta",  pacienteJSON1);
		} catch (PersistentException e) {
			
			e.printStackTrace();
		}

		return resultado.toString();
	}

	/**
	 * Actualiza un paciente.
	 *
	 * @param pacienteJSON json que representa el paciente. Debe llevar al menos el rut ej: {"rut":"algo"}
	 * @return the int
	 */
	public String updatePaciente(String pacienteJSON) {
		JsonObject resultado = new JsonObject();
		if (pacienteJSON == null || pacienteJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject paciente = jsonParser.parse(pacienteJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		System.out.println(pacienteJSON);
		if (!paciente.has("rut")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta",  "Paciente no contiente el rut");
			return resultado.toString();
		}
		// Obtener prestacion
		DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		PersistentTransaction t = null;
		try {

			if (lDAOFactory.getPacienteDAO().getPacienteByORMID(
					paciente.get("rut").getAsString()) == null) {
				
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta",  "Paciente no existe");
				return resultado.toString();
			}

			t = orm.PruebaPDSPersistentManager.instance().getSession()
					.beginTransaction();

			PacienteDAO lormPacienteDAO = lDAOFactory.getPacienteDAO();
			Paciente lormPaciente = lormPacienteDAO.loadPacienteByQuery(
					"Paciente.rut = '" + paciente.get("rut").getAsString()
							+ "'", null);

			// ojo que se pone directo, deberia filtrarse
			if (paciente.has("nombre")) {
				lormPaciente.setNombre(paciente.get("nombre").getAsString());
			}
			if (paciente.has("direccion")) {
				lormPaciente.setDireccion(paciente.get("direccion")
						.getAsString());
			}
			// imposible cambiar rut de momento
			/*
			 * if (paciente.has("rutnuevo")) {
			 * lormPaciente.setRut(paciente.get("rutnuevo").getAsString()); }
			 */

			// actualizar
			lormPacienteDAO.save(lormPaciente);
			t.commit();
			System.out.println("Actualizacion exitosa");
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta",  "Ok");
		} catch (Exception e) {
			
			e.printStackTrace();
			try {
				t.rollback();
			} catch (PersistentException e1) {
				
				e1.printStackTrace();
			}
		}

		return resultado.toString();
	}

	/**
	 * Elimina un paciente.
	 *
	 * @param pacienteJSON json que representa el paciente. Debe llevar al menos el rut ej: {"rut":"algo"}
	 * @return the int
	 */
	public String deletePaciente(String pacienteJSON) {
		JsonObject resultado = new JsonObject();
		if (pacienteJSON == null || pacienteJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject paciente = jsonParser.parse(pacienteJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		System.out.println(pacienteJSON);

		if (!paciente.has("rut")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Paciente no contiente el rut");
			return resultado.toString();
		}
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		PersistentTransaction t = null;
		try {
			if (lDAOFactory.getPacienteDAO().getPacienteByORMID(
					paciente.get("rut").getAsString()) == null) {
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta", "Paciente no existe");
				return resultado.toString();
			}

			t = orm.PruebaPDSPersistentManager.instance().getSession()
					.beginTransaction();

			PacienteDAO lormPacienteDAO = lDAOFactory.getPacienteDAO();
			Paciente lormPaciente = lormPacienteDAO.loadPacienteByQuery(
					"Paciente.rut = '" + paciente.get("rut").getAsString()
							+ "'", null);
			lormPacienteDAO.delete(lormPaciente);
			// actualizarse
			t.commit();
			System.out.println("Update successfully!");
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta", "Ok");
		} catch (Exception e) {			
			e.printStackTrace();
			try {
				t.rollback();
			} catch (PersistentException e1) {
				e1.printStackTrace();
			}
		}

		return resultado.toString();
	}

	/**
	 * Adds the paciente.
	 *
	 * @param pacienteJSON json que representa el paciente.
	 * @return the int
	 */
	public String addPaciente(String pacienteJSON) {
		JsonObject resultado = new JsonObject();
		if (pacienteJSON == null || pacienteJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject paciente = jsonParser.parse(pacienteJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		System.out.println(pacienteJSON);
		if (!paciente.has("rut") || !paciente.has("nombre")
				|| !paciente.has("direccion")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Faltan datos del paciente");
			return resultado.toString();
		}
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		try {
			Paciente nuevoPaciente = new Paciente();
			nuevoPaciente.setRut(paciente.get("rut").getAsString());
			nuevoPaciente.setNombre(paciente.get("nombre").getAsString());
			nuevoPaciente.setDireccion(paciente.get("direccion").getAsString());
			lDAOFactory.getPacienteDAO().save(nuevoPaciente);
			
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta", "Ok");
		} catch (PersistentException e) {
			
			e.printStackTrace();
		}

		return resultado.toString();
	}

	// prestacion pacientes

	/**
	 * Adds the prestacion paciente.
	 *
	 * @param prestacionJSON the prestacion json
	 * @return the int
	 */
	public String addPrestacionPaciente(String prestacionJSON) {
		JsonObject resultado = new JsonObject();
		if (prestacionJSON == null || prestacionJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}
		JsonParser jsonParser = new JsonParser();
		JsonObject prestacion = jsonParser.parse(prestacionJSON)
				.getAsJsonObject();

		// Validar parametros recibidos no nulos
		System.out.println(prestacionJSON);
		if (!prestacion.has("diagnostico") || !prestacion.has("fecha")
				|| !prestacion.has("Pacienterut")
				|| !prestacion.has("Prestacionid")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Datos nulos");
			return resultado.toString();
		}
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		try {
			Prestacion prestacionORM = lDAOFactory.getPrestacionDAO()
					.getPrestacionByORMID(
							prestacion.get("Prestacionid").getAsInt());
			Paciente pacienteORM = lDAOFactory.getPacienteDAO()
					.getPacienteByORMID(
							prestacion.get("Pacienterut").getAsString());
			PrestacionPaciente nuevaPrestacion = new PrestacionPaciente();
			Date fechaORM = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
					Locale.ENGLISH)
					.parse(prestacion.get("fecha").getAsString());

			nuevaPrestacion.setDiagnostico(prestacion.get("diagnostico")
					.getAsString());
			nuevaPrestacion.setFecha(fechaORM);
			nuevaPrestacion.setPacienterut(pacienteORM);
			nuevaPrestacion.setPrestacion(prestacionORM);

			lDAOFactory.getPrestacionPacienteDAO().save(nuevaPrestacion);
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta", "Ok");

		} catch (PersistentException | ParseException e) {
			
			e.printStackTrace();
		}

		return resultado.toString();
	}

	/**
	 * Update prestacion paciente.
	 *
	 * @param prestacionJSON the prestacion json
	 * @return the int
	 */
	public String updatePrestacionPaciente(String prestacionJSON){
		JsonObject resultado = new JsonObject();
		if (prestacionJSON == null || prestacionJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject prestacionPaciente = jsonParser.parse(prestacionJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		if (!prestacionPaciente.has("id")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Falta id");
			return resultado.toString();
		}
		// Obtener prestacion
		DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		PersistentTransaction t = null;
		try {

			if (lDAOFactory.getPrestacionPacienteDAO().getPrestacionPacienteByORMID(
					prestacionPaciente.get("id").getAsInt()) == null) {
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta", "No existe tal PrestacionPaciente");
				return resultado.toString();
			}

			t = orm.PruebaPDSPersistentManager.instance().getSession()
					.beginTransaction();

			PrestacionPacienteDAO lormPrestacionPacienteDAO = lDAOFactory.getPrestacionPacienteDAO();
			PrestacionPaciente lormPrestacionPaciente = lormPrestacionPacienteDAO.loadPrestacionPacienteByQuery(
					"PrestacionPaciente.id = '" + prestacionPaciente.get("id").getAsString()
							+ "'", null);

			// ojo que se pone directo, deberia filtrarse
			if (prestacionPaciente.has("diagnostico")) {
				lormPrestacionPaciente.setDiagnostico(prestacionPaciente.get("diagnostico").getAsString());
			}
			
			if (prestacionPaciente.has("Pacienterut")) {
				Paciente pacienteORM = lDAOFactory.getPacienteDAO()
						.getPacienteByORMID(
								prestacionPaciente.get("Pacienterut").getAsString());
				lormPrestacionPaciente.setPacienterut(pacienteORM);
			}
			
			if (prestacionPaciente.has("Prestacionid")) {
				Prestacion prestacionORM = lDAOFactory.getPrestacionDAO()
						.getPrestacionByORMID(
								prestacionPaciente.get("Prestacionid").getAsInt());
				lormPrestacionPaciente.setPrestacion(prestacionORM);
			}
			
			if (prestacionPaciente.has("fecha")) {
				Date fechaORM = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",
						Locale.ENGLISH)
						.parse(prestacionPaciente.get("fecha").getAsString());
				lormPrestacionPaciente.setFecha(fechaORM);
			}

			// actualizar
			lormPrestacionPacienteDAO.save(lormPrestacionPaciente);
			t.commit();
			System.out.println("Update successfully!");
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta", "Ok");
		} catch (Exception e) {
			
			e.printStackTrace();
			try {
				t.rollback();
			} catch (PersistentException e1) {
				
				e1.printStackTrace();
			}
		}

		return resultado.toString();
	}
	
	/**
	 * Gets the prestacion paciente.
	 *
	 * @param prestacionJSON the prestacion json
	 * @return the prestacion paciente
	 */
	public String getPrestacionPaciente(String prestacionJSON){
		JsonObject resultado = new JsonObject();
		if (prestacionJSON == null || prestacionJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject prestacionPaciente = jsonParser.parse(prestacionJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		if (!prestacionPaciente.has("id")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "PrestacionPaciente no contiente el id");
			return resultado.toString();
		}
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		try {
			PrestacionPaciente prestacionPacienteORM = lDAOFactory.getPrestacionPacienteDAO()
					.getPrestacionPacienteByORMID(prestacionPaciente.get("id").getAsInt());

			
			if(prestacionPacienteORM == null){
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta",  "PrestacionPaciente no existe");
				return resultado.toString();
			}
			
			// se hace manual puesto que GSON se queja de relacion
			// circular
			
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			
			JsonObject prestPaciente = new JsonObject();
			prestPaciente.addProperty("id", prestacionPacienteORM.getId());
			prestPaciente.addProperty("diagnostico", prestacionPacienteORM.getDiagnostico());
			prestPaciente.addProperty("fecha", df.format(prestacionPacienteORM.getFecha()));
			prestPaciente.addProperty("Pacienterut", prestacionPacienteORM.getPacienterut().getRut());
			prestPaciente.addProperty("Prestacionid", prestacionPacienteORM.getPrestacion().getId());

			resultado.addProperty("resultado", 1);
			resultado.add("respuesta", prestPaciente);
		} catch (PersistentException e) {
			e.printStackTrace();
		}

		return resultado.toString();
	}
	
	/**
	 * Delete prestacion paciente.
	 *
	 * @param prestacionJSON the prestacion json
	 * @return the int
	 */
	public String deletePrestacionPaciente(String prestacionJSON){
		JsonObject resultado = new JsonObject();
		if (prestacionJSON == null || prestacionJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject prestacionPaciente = jsonParser.parse(prestacionJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		if (!prestacionPaciente.has("id")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Falta id");
			return resultado.toString();
		}
		
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		PersistentTransaction t = null;
		try {
			if (lDAOFactory.getPrestacionPacienteDAO().getPrestacionPacienteByORMID(
					prestacionPaciente.get("id").getAsInt()) == null) {
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta", "No existe tal prestacionpaciente");
				return resultado.toString();
			}

			t = orm.PruebaPDSPersistentManager.instance().getSession()
					.beginTransaction();

			PrestacionPacienteDAO lormPrestacionPacienteDAO = lDAOFactory.getPrestacionPacienteDAO();
			PrestacionPaciente lormPrestacionPaciente = lormPrestacionPacienteDAO.loadPrestacionPacienteByQuery(
					"PrestacionPaciente.id = '" + prestacionPaciente.get("id").getAsString()
							+ "'", null);
			lormPrestacionPacienteDAO.delete(lormPrestacionPaciente);
			// actualizarse
			t.commit();
			System.out.println("Update successfully!");
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta", "Ok");
		} catch (Exception e) {
			
			e.printStackTrace();

			try {
				t.rollback();
			} catch (PersistentException e1) {
				
				e1.printStackTrace();
			}
		}

		return resultado.toString();
	}
	
	// prestaciones
	
	/**
	 * Adds the prestacion.
	 *
	 * @param prestacionJSON the prestacion json
	 * @return the int
	 */
	public String addPrestacion(String prestacionJSON){
		JsonObject resultado = new JsonObject();
		if (prestacionJSON == null || prestacionJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}
		JsonParser jsonParser = new JsonParser();
		JsonObject prestacion = jsonParser.parse(prestacionJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		if (!prestacion.has("nombre")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Falta el nombre");
			return resultado.toString();
		}
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		try {
			Prestacion nuevaPrestacion = new Prestacion();
			nuevaPrestacion.setNombre(prestacion.get("nombre").getAsString());
			lDAOFactory.getPrestacionDAO().save(nuevaPrestacion);
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta", "Ok");
		} catch (PersistentException e) {
			
			e.printStackTrace();
		}

		return resultado.toString();
	}
	
	/**
	 * Update prestacion.
	 *
	 * @param prestacionJSON the prestacion json
	 * @return the int
	 */
	public String updatePrestacion(String prestacionJSON){
		JsonObject resultado = new JsonObject();
		if (prestacionJSON == null || prestacionJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject prestacion = jsonParser.parse(prestacionJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		if (!prestacion.has("id") || !prestacion.has("nombre") ) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Faltan datos");
			return resultado.toString();
		}
		// Obtener prestacion
		DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		PersistentTransaction t = null;
		try {

			if (lDAOFactory.getPrestacionDAO().getPrestacionByORMID(
					prestacion.get("id").getAsInt()) == null) {
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta", "No existe tal prestacion");
				return resultado.toString();
			}

			t = orm.PruebaPDSPersistentManager.instance().getSession()
					.beginTransaction();

			PrestacionDAO lormPrestacionDAO = lDAOFactory.getPrestacionDAO();
			Prestacion lormPrestacion = lormPrestacionDAO.loadPrestacionByQuery(
					"Prestacion.id = '" + prestacion.get("id").getAsString()
							+ "'", null);

			// ojo que se pone directo, deberia filtrarse
			if (prestacion.has("nombre")) {
				lormPrestacion.setNombre(prestacion.get("nombre").getAsString());
			}
					// actualizar
			lormPrestacionDAO.save(lormPrestacion);
			t.commit();
			System.out.println("Update successfully!");
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta", "Ok");
			return resultado.toString();
		} catch (Exception e) {
			
			e.printStackTrace();
			try {
				t.rollback();
			} catch (PersistentException e1) {
				
				e1.printStackTrace();
			}
		}

		return resultado.toString();
	}
	
	/**
	 * Gets the prestacion.
	 *
	 * @param prestacionJSON the prestacion json
	 * @return the prestacion
	 */
	public String getPrestacion(String prestacionJSON){
		JsonObject resultado = new JsonObject();
		if (prestacionJSON == null || prestacionJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject prestacion = jsonParser.parse(prestacionJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		if (!prestacion.has("id")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Prestacion no contiente el id");
			return resultado.toString();
		}
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		try {
			Prestacion prestacionORM = lDAOFactory.getPrestacionDAO()
					.getPrestacionByORMID(prestacion.get("id").getAsInt());

			if(prestacionORM == null){
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta",  "Prestacion no existe");
				return resultado.toString();
			}
			// se hace manual puesto que GSON se queja de relacion
			// circular		
			JsonObject prest = new JsonObject();
			prest.addProperty("id", prestacionORM.getId());
			prest.addProperty("nombre", prestacionORM.getNombre());

			resultado.addProperty("resultado", 1);
			resultado.add("respuesta",prest);
		} catch (PersistentException e) {
			
			e.printStackTrace();
		}

		return resultado.toString();
	}
	
	/**
	 * Delete prestacion.
	 *
	 * @param prestacionJSON the prestacion json
	 * @return the int
	 */
	public String deletePrestacion(String prestacionJSON){
		JsonObject resultado = new JsonObject();
		if (prestacionJSON == null || prestacionJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject prestacion = jsonParser.parse(prestacionJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		if (!prestacion.has("id")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Falta el id");
			return resultado.toString();
		}
		
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		PersistentTransaction t = null;
		try {
			if (lDAOFactory.getPrestacionDAO().getPrestacionByORMID(
					prestacion.get("id").getAsInt()) == null) {
				resultado.addProperty("resultado", 0);
				resultado.addProperty("respuesta", "No existe tal prestacion");
				return resultado.toString();
			}

			t = orm.PruebaPDSPersistentManager.instance().getSession()
					.beginTransaction();

			PrestacionDAO lormPrestacionDAO = lDAOFactory.getPrestacionDAO();
			Prestacion lormPrestacionPaciente = lormPrestacionDAO.loadPrestacionByQuery(
					"Prestacion.id = '" + prestacion.get("id").getAsString()
							+ "'", null);
			lormPrestacionDAO.delete(lormPrestacionPaciente);
			// actualizarse
			t.commit();
			System.out.println("Update successfully!");
			resultado.addProperty("resultado", 1);
			resultado.addProperty("respuesta", "Ok");
		} catch (Exception e) {
			
			e.printStackTrace();

			try {
				t.rollback();
			} catch (PersistentException e1) {
				e1.printStackTrace();
			}
		}

		return resultado.toString();
	}

	// custom
	
	/**
	 * Gets the prestaciones by paciente.
	 *
	 * @param pacienteJSON the paciente json
	 * @return the prestaciones by paciente
	 */
	public String getPrestacionesByPaciente(String pacienteJSON) {
		JsonObject resultado = new JsonObject();
		if (pacienteJSON == null || pacienteJSON.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}

		JsonParser jsonParser = new JsonParser();
		JsonObject paciente = jsonParser.parse(pacienteJSON).getAsJsonObject();

		// Validar parametros recibidos no nulos
		System.out.println(pacienteJSON);
		if (!paciente.has("rut")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Paciente no tiene rut");
			return resultado.toString();
		}
		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		try {
			// ojo con la propiedad en minuscula (
			// PrestacionPaciente.pacienterut )
			PrestacionPaciente[] prestacionesORM = lDAOFactory
					.getPrestacionPacienteDAO().listPrestacionPacienteByQuery(
							"PrestacionPaciente.pacienterut = '"
									+ paciente.get("rut").getAsString() + "'",
							null);

			// se hace manual puesto que GSON se queja de relacion
			// circular
			JsonArray prestaciones = new JsonArray();
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

			for (PrestacionPaciente prestacion : prestacionesORM) {
				JsonObject prestacionJSON = new JsonObject();
				prestacionJSON.addProperty("diagnostico",
						prestacion.getDiagnostico());
				prestacionJSON.addProperty("id", prestacion.getId());
				prestacionJSON.addProperty("fecha",
						df.format(prestacion.getFecha()));
				prestacionJSON.addProperty("rut", prestacion.getPacienterut()
						.getRut());
				prestacionJSON.addProperty("prestacion", prestacion
						.getPrestacion().getNombre());
				prestaciones.add(prestacionJSON);
			}

			resultado.addProperty("resultado", 1);
			resultado.add("respuesta", prestaciones);

			System.out.println(resultado);

		} catch (PersistentException e) {
			
			e.printStackTrace();
		}

		return resultado.toString();
	}

	/**
	 * Gets the pacientes by prestacion.
	 *
	 * @param consultaRAW the consulta raw
	 * @return the pacientes by prestacion
	 */
	public String getPacientesByPrestacion(String consultaRAW) {
		JsonObject resultado = new JsonObject();
		if (consultaRAW == null || consultaRAW.isEmpty()) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Consulta vacia");
			return resultado.toString();
		}
		
		
		JsonParser jsonParser = new JsonParser();
		JsonObject consultaJSON = jsonParser.parse(consultaRAW)
				.getAsJsonObject();

		if (!consultaJSON.has("prestacionid")
				&& !consultaJSON.has("fechadesde")
				&& !consultaJSON.has("fechahasta")) {
			resultado.addProperty("resultado", 0);
			resultado.addProperty("respuesta", "Faltan parametros");
			return resultado.toString();
		}

		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		String consulta = "";

		if (consultaJSON.has("prestacionid")) {
			consulta += "PrestacionPaciente.prestacion = '"
					+ consultaJSON.get("prestacionid").getAsString() + "'";
		}

		if (consultaJSON.has("fechadesde")) {
			if (!consulta.isEmpty()) {
				consulta += "  AND ";
			}
			consulta += "PrestacionPaciente.fecha >= '"
					+ consultaJSON.get("fechadesde").getAsString() + "'";
		}

		if (consultaJSON.has("fechahasta")) {
			if (!consulta.isEmpty()) {
				consulta += "  AND ";
			}
			consulta += "PrestacionPaciente.fecha <= '"
					+ consultaJSON.get("fechahasta").getAsString() + "'";
		}

		try {
			System.out.println(consulta);
			// ojo con la propiedad en minuscula (
			// PrestacionPaciente.pacienterut )
			PrestacionPaciente[] prestacionesORM = lDAOFactory
					.getPrestacionPacienteDAO().listPrestacionPacienteByQuery(
							consulta, null);
			ArrayList<Paciente> pacientes = new ArrayList<>();

			for (PrestacionPaciente prest : prestacionesORM) {
				if (!pacientes.contains(prest.getPacienterut())) {
					pacientes.add(prest.getPacienterut());
				}
			}

			// se hace manual puesto que GSON se queja de relacion
			// circular
			JsonArray pacientesORM = new JsonArray();

			for (Paciente paciente : pacientes) {
				JsonObject pacienteORM = new JsonObject();
				pacienteORM.addProperty("rut", paciente.getRut());
				pacienteORM.addProperty("nombre", paciente.getNombre());
				pacienteORM.addProperty("direccion", paciente.getDireccion());
				pacientesORM.add(pacienteORM);
			}

			resultado.addProperty("resultado", 1);
			resultado.add("respuesta", pacientesORM);


			System.out.println(resultado);

		} catch (PersistentException e) {
			
			e.printStackTrace();
		}

		return resultado.toString();
	}

	/**
	 * Gets the prestaciones.
	 *
	 * @return the prestaciones
	 */
	public String getPrestaciones(){
		JsonObject resultado = new JsonObject();

		// Obtener prestacion
		orm.DAOFactory lDAOFactory = orm.DAOFactory.getDAOFactory();
		try {
			// ojo con la propiedad en minuscula (
			// PrestacionPaciente.pacienterut )
			Prestacion[] prestacionesORM = lDAOFactory
					.getPrestacionDAO().listPrestacionByQuery(null,
							null);

			// se hace manual puesto que GSON se queja de relacion
			// circular
			JsonArray prestaciones = new JsonArray();
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

			for (Prestacion prestacion : prestacionesORM) {
				JsonObject prestacionJSON = new JsonObject();
				prestacionJSON.addProperty("id", prestacion.getId());
				prestacionJSON.addProperty("nombre",
						prestacion.getNombre());
				prestaciones.add(prestacionJSON);
			}

			resultado.addProperty("resultado", 1);
			resultado.add("respuesta", prestaciones);

			System.out.println(resultado);

		} catch (PersistentException e) {
			e.printStackTrace();
		}

		return resultado.toString();
	}
	
}
